#include<iostream>
#include<sys/timerfd.h>
#include<cassert>
#include<unistd.h>
#include<fcntl.h>

int main()
{
    int timerfd = timerfd_create(CLOCK_MONOTONIC,TFD_CLOEXEC|TFD_NONBLOCK);
    assert(timerfd!=-1);
    struct itimerspec timeout;
    //第一次超时时间间隔
    timeout.it_value.tv_sec = 2;     // 第一次超时为 3 s
    timeout.it_value.tv_nsec = 0;
    //第二次以及之后的超时时间间隔
    timeout.it_interval.tv_sec = 1;  // 往后每隔 1s 超时一次
    timeout.it_interval.tv_nsec = 0;

    int ret = timerfd_settime(timerfd,0,&timeout,NULL);  //设置定时通知
    assert(ret!=-1);  //返回值为-1表示设置失败，但是一般是不会失败的，可以不用关心

    int sec =0;
    uint64_t times = 0;
    while(1)
    {
        sleep(1);
        sec++;
        ret = read(timerfd,&times,sizeof times);
        if(ret>=0)
        {
            std::cout<<"第"<<sec<<"秒触发了一次超时"<<std::endl;
        }
    }


    // sleep(10);
    // uint64_t times = 0;
    // //十秒之后读取下超时的次数
    // ret = read(timerfd,&times,sizeof times);
    // assert(read>=0);

    // std::cout<<"times:"<<times<<std::endl;

    return 0;
}